// API: 附加分审查相关接口
import { apiClient } from '@/utils/require'

/**
 * 附加分审查类型定义
 */
export interface ExtraReviewStudent {
  id: number
  username: string
  student_id?: string
  class_name?: string
}

export interface ExtraReview {
  id: number
  sort: string              // 证书类别
  name: string              // 证书名称
  ranks: string             // 级别
  levels: string            // 等级
  picture?: string          // 证书图片
  picture_url?: string      // 图片完整URL
  grade?: number            // 分数
  first_efficient: boolean  // 学工办审核
  second_efficient: boolean // 辅导员审核
  third_efficient: boolean  // 班委审核
  time?: number             // 年份
  student?: ExtraReviewStudent
  classes?: string          // 班级
  auditor?: string          // 审查人员
  status?: string           // 审核状态
  created_at: string
  updated_at: string
}

export interface PaginatedResponse<T> {
  count: number
  next: string | null
  previous: string | null
  results: T[]
}

/**
 * 附加分审查API（三级审核流程）
 * 
 * API说明：
 * - 基础路径：/api/extra-reviews/
 * - 认证方式：Token认证
 * - 审核流程：班委（third） → 辅导员（second） → 学工办（first）
 * - 权限控制：
 *   - 学生：提交申请、查看自己的记录
 *   - 班委：审核本班学生（third_efficient）
 *   - 辅导员：审核本班学生（second_efficient）
 *   - 学工办：审核所有学生（first_efficient）
 */
export const extraReviewAPI = {
  /**
   * 获取审查列表
   * 
   * 接口：GET /api/extra-reviews/
   * 权限：已认证用户（根据角色返回不同数据）
   * - 学生：只能看到自己的记录
   * - 班委：看到本班待审核的记录
   * - 辅导员：看到本班待审核的记录
   * - 学工办：看到所有待审核的记录
   * 
   * @param params 查询参数
   * @param params.page 页码
   * @param params.page_size 每页数量
   * @param params.student 按学生ID筛选
   * @param params.status 审核状态（pending待审核、approved已通过）
   * @param params.time 按年份筛选
   * 
   * @returns 附加分审查列表
   */
  getExtraReviewList: (params?: {
    page?: number
    page_size?: number
    student?: number
    status?: 'pending' | 'approved'
    time?: number
  }) => {
    return apiClient.get<PaginatedResponse<ExtraReview>>('/extra-reviews/', { params })
  },

  /**
   * 获取审查详情
   * 
   * 接口：GET /api/extra-reviews/{id}/
   * 权限：已认证用户
   * 
   * @param id 审查ID
   * @returns 完整的审查信息（包含证书图片、三级审核状态）
   */
  getExtraReviewDetail: (id: number) => {
    return apiClient.get<ExtraReview>(`/extra-reviews/${id}/`)
  },

  /**
   * 提交审查申请（上传证书）
   * 
   * 接口：POST /api/extra-reviews/
   * 权限：学生
   * 
   * @param data 请求数据：
   * - sort: 证书类别（必填）
   * - name: 证书名称（必填）
   * - ranks: 级别（必填）
   * - levels: 等级（必填）
   * - picture: 证书图片URL（必填，已上传到COS的URL）
   * - time: 年份（必填）
   * 
   * @returns 提交成功的审查记录
   * 
   * @example
   * const data = {
   *   sort: '学科竞赛',
   *   name: '数学建模大赛',
   *   ranks: '国家级',
   *   levels: '一等奖',
   *   picture: 'https://luke-1332125786.cos.ap-beijing.myqcloud.com/certificates/20251110/abc123.jpg',
   *   time: 2024
   * }
   * extraReviewAPI.submitExtraReview(data)
   */
  submitExtraReview: (data: Omit<ExtraReview, 'id' | 'student' | 'created_at' | 'updated_at'>) => {
    return apiClient.post('/extra-reviews/', data)
  },

  /**
   * 更新审查信息
   * 
   * 接口：PUT /api/extra-reviews/{id}/
   * 权限：本人或管理员
   * 
   * @param id 审查ID
   * @param data 更新的数据
   * @returns 更新后的审查信息
   */
  updateExtraReview: (id: number, data: Partial<ExtraReview>) => {
    return apiClient.put(`/extra-reviews/${id}/`, data)
  },

  /**
   * 删除审查记录
   * 
   * 接口：DELETE /api/extra-reviews/{id}/
   * 权限：本人或管理员
   * 
   * @param id 审查ID
   * @returns 204 No Content
   */
  deleteExtraReview: (id: number) => {
    return apiClient.delete(`/extra-reviews/${id}/`)
  },

  /**
   * 审核通过
   * 
   * 接口：POST /api/extra-reviews/{id}/approve/
   * 权限：根据level不同需要不同权限
   * - first: 学工办权限
   * - second: 辅导员权限
   * - third: 班委权限
   * 
   * @param id 审查ID
   * @param level 审核级别（first=学工办、second=辅导员、third=班委）
   * @param remarks 审核备注（选填）
   * 
   * @returns 审核后的记录
   * 
   * @example
   * // 班委审核通过
   * extraReviewAPI.approveExtraReview(1, 'third', '证书真实有效')
   */
  approveExtraReview: (id: number, level: 'first' | 'second' | 'third', remarks?: string) => {
    return apiClient.post(`/extra-reviews/${id}/approve/`, { level, remarks })
  },

  /**
   * 审核拒绝
   * 
   * 接口：POST /api/extra-reviews/{id}/reject/
   * 权限：根据level不同需要不同权限
   * 
   * @param id 审查ID
   * @param level 审核级别（first=学工办、second=辅导员、third=班委）
   * @param reason 拒绝原因（必填）
   * 
   * @returns 审核后的记录
   * 
   * @example
   * // 辅导员拒绝
   * extraReviewAPI.rejectExtraReview(1, 'second', '证书不清晰，请重新上传')
   */
  rejectExtraReview: (id: number, level: 'first' | 'second' | 'third', reason: string) => {
    return apiClient.post(`/extra-reviews/${id}/reject/`, { level, reason })
  },

  /**
   * 批量同步分数
   * 
   * 接口：POST /api/extra-reviews/sync_grades/
   * 权限：仅管理员
   * 
   * 根据证书字典批量更新所有附加分记录的分数
   * 
   * @returns 同步结果
   */
  syncGrades: () => {
    return apiClient.post('/extra-reviews/sync_grades/')
  }
}

export default extraReviewAPI
